package test_pkg

//用带缓冲的通道实现对最大并发数的限制

const (
	//假设最大允许内存 10MB
	availableMemory = 10 << 20
	//假设单个请求内存 10KB
	averageMemoryPerRquest = 10 << 10
	//最大并发量1024
	maxreqs = availableMemory / averageMemoryPerRquest
)

var sem = make(chan int, maxreqs)

type Request struct {
	//自定义的一些参数
	a     int
	reply chan int
}

func process(r *Request) {
	//处理一些高资源占用/耗时的逻辑处理
}

func handle(r *Request) {

	process(r)
	// 信号完成：开始启用下一个请求
	// 将 sem 的缓冲区释放一个位置
	<-sem

}

func server(queue chan *Request) {
	for {
		sem <- 1
		//当通道满载（1024）时被阻塞 停止在这里等待 等到 sem 释放出空间后再继续执行
		request := <-queue
		go handle(request)
	}
}

func Run_task() {
	queue := make(chan *Request)
	go server(queue)
}
